package com.itany.corejava.code08_常用类.内部类;

/**
 * @author 石小俊
 * @date 2023年05月04日 14:48
 */
public class Test01_成员内部类 {
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.show();
        System.out.println("**********************在非外部类中访问内部类成员**********************");
        Outer.Inner inner = outer.new Inner();
        System.out.println(inner.getName());
        inner.print();
        // 不能访问private修饰的成员
        // inner.test();
    }
}

// 外部类
class Outer {
    private static String name = "admin";
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    private void test() {
        System.out.println("这是外部类的private修饰的方法");
    }

    public void show() {
        System.out.println("**********************外部类的方法**********************");
        Inner inner = new Inner();
        System.out.println(inner.getName());
        inner.setGender("男");
        System.out.println(inner.getGender());
        System.out.println(inner.name);
        System.out.println(inner.gender);
        // 访问外部类
        System.out.println(name);
        inner.test();
        // inner.print();
    }

    // 定义成员内部类
    class Inner {
        // 内部类中的成员与正常类没有区别
        private String name = "alice";
        private String gender;

        public Inner() {
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getGender() {
            return gender;
        }

        public void setGender(String gender) {
            this.gender = gender;
        }

        private void test() {
            System.out.println("这是内部类中private修饰的方式");
        }

        public void print() {
            System.out.println("**********************内部类方法**********************");
            // 可以直接使用属性名进行访问
            // 如果内部类中没有重名属性,则直接访问外部类属性
            // 如果内部类中存在重名属性,则访问的是内部类属性
            System.out.println(age);
            System.out.println(name);
            Outer outer = new Outer();
            outer.show();
            // 如果想要访问外部类属性,可以通过对象.属性名进行访问
            System.out.println("外部类的age:" + outer.age);
            System.out.println("外部类的name:" + outer.name);
            System.out.println("外部类的name:" + Outer.this.name);
            System.out.println(Outer.name);
            test();
            outer.test();
            Outer.this.test();
        }
    }
}

